/*
在 ACM / ICPC 地区赛中，参赛队可以直接提交题目答案，但若答案错误，则再次提交时最后的成绩会受到影响。比赛的测试系统对每次提交的程序进行评判，结果是 AC 或者某种错误，参赛队能看到这个结果。

为了奖励优秀的队伍同时确定进军世界总决赛的资格名单，当两个队伍做出的题目数量相同时，会按照其使用的时间来进行进一步的排名。时间有两个部分，第一是总的解题时间，二是惩罚时间。所谓惩罚时间是指提交程序未通过时被罚的时间，每一次未通过的提交，都会在最终用于排名的时间中增加 20 分钟。对于没解决的题目不计时。

你的程序将读入一张运行结果清单，然后打印出前三名的成绩。

输入
输入文件包含若干测试数据集。

每个测试数据由两个部分组成，第一部分包含了一个正整数，它表示参赛队伍的个数。接下来的几行是每次提交的结果。每行表示一次提交的结果，包括提交时间、队伍编号、问题编号和裁定结果。

当一行中提交时间一项为 0 时，则表示当前的数据集结束。当参赛队伍的个数为 0 时，则表示全部输入的结束。

每个测试集中队伍的个数不超过 100 个，提交的次数不超过 10000 次。

输出
针对每一组输入，输出前三名的比分，包括队号、做出题数、比赛用时、名次。在输出排名前，要输出“case n”，其中 n 表示当前是第几组输入。

假设：可能有好几队在同一名次。比如如果有几队都是第三名，则将他们全部输出；如果有两队是第二名，则没有第三名。当队伍名次相同时，按照队伍编号从小到大输出。
*/

#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif
#if defined(_WIN32) && !defined(__cplusplus)
#define inline __inline
#endif

#include <stdio.h>
#include <stdlib.h>
#include <memory.h>

typedef int		BOOL;
#define TRUE	1
#define FALSE	0

#define MAX_TEAM_NUM 105
#define MAX_QUESTION_NUM 20

typedef struct {
	int QuesNo;
	BOOL bAC;
	int ErrorSubmitTimes;
	int ACTime;
}Question;

typedef struct {
	int TeamNo;
	int ACNum;
	int TotalTime;
	Question Question[MAX_QUESTION_NUM];
}Team;


int cmp(const void *a, const void *b)
{
	Team *teamA = (Team *)a;
	Team *teamB = (Team *)b;
	if (teamA->ACNum != teamB->ACNum) return teamB->ACNum - teamA->ACNum;
	else if (teamA->TotalTime != teamB->TotalTime) return teamA->TotalTime - teamB->TotalTime;
	else return teamA->TeamNo - teamB->TeamNo;
}

int main()
{
	int teamNum = 0;

	Team team[MAX_TEAM_NUM];

	int setNum = 0;
	while (1)
	{
		scanf("%d", &teamNum);
		if (teamNum == 0) break;

		setNum++;
		memset(team, 0, sizeof(team[0]) * 105);
		int time, teamNo, questionNo;
		char result[5] = {0};
		while (1)
		{
			scanf("%d", &time);
			if (time == 0) break;

			scanf("%d%d%s", &teamNo, &questionNo, result);

			Team *curTeam = &team[teamNo - 1];
			curTeam->TeamNo = teamNo;

			curTeam->Question[questionNo - 1].QuesNo = questionNo;
			if (result[0] == 'y')
			{
				curTeam->Question[questionNo - 1].bAC = TRUE;
				if (curTeam->Question[questionNo - 1].ACTime == 0)curTeam->Question[questionNo - 1].ACTime = time;
			}
			else
			{
				curTeam->Question[questionNo - 1].bAC = FALSE;
				curTeam->Question[questionNo - 1].ErrorSubmitTimes++;
			}			
		}

		for (int i = 0; i < teamNum; i++)
		{
			Team *curTeam = &team[i];
			for (int j = 0; j < MAX_QUESTION_NUM; j++)
			{
				if (curTeam->Question[j].bAC)
				{
					curTeam->ACNum++;
					curTeam->TotalTime += curTeam->Question[j].ACTime;
					int submitTimes = curTeam->Question[j].ErrorSubmitTimes;
					if (submitTimes > 0)
					{
						curTeam->TotalTime += submitTimes * 20;
					}
				}
			}
		}

		qsort(team, teamNum, sizeof(Team), cmp);

		printf("case %d:\n", setNum);
		int index = 1; // 当前名次
		int printTeamNum = 0;// 当前名字的人数
		for (int i = 1; i < teamNum + 1; i++)
		{	
			printf("%d %d %d %d\n", team[i - 1].TeamNo, team[i - 1].ACNum, team[i - 1].TotalTime, index);
			printTeamNum++;

			if (team[i].ACNum != team[i - 1].ACNum || team[i].TotalTime != team[i - 1].TotalTime)
			{				
				index += printTeamNum;
				printTeamNum = 0;				
			}
			if (index >= 4) break;
		}
	}

	return 0;
}